import layoutHeaderAside from '@/layout/header-aside'
const _import = require('@/libs/util.import.' + process.env.NODE_ENV)
import * as helper from './util.helper'
import { isEmpty } from 'lodash'

import demo from '@/router/modules/demo'

const route = {}

/**
     * @description 检验是否为合法路由
     * @param {Object} sourceItem 原始数据的一项
     */
function isEffectiveRoute(sourceItem) {
  const hasAllRequiredProperties = [
    'routeKey',
    'routePath',
    'routeComponent'
  ].reduce((res, keyname) => !((!res || sourceItem[keyname] === '')), true)
  if (!hasAllRequiredProperties) return
  return true
}
/**
     * @description 检验是否已经注册过此路由
     * @description 在 vue-router 中路由的 name 不允许重复
     * @param {Array} registered 已经注册的路由
     * @param {Object} sourceItem 原始数据的一项
     */
function isUnregistered(registered, sourceItem) {
  return !registered.find(item => item.name === sourceItem.routeKey)
}

/**
   * @description 检查一个菜单是否有子菜单
   * @param {Object} item 接口返回菜单中的一项原始数据
   */
function hasMenuChildren(item = {}, keyname = 'children') {
  // eslint-disable-next-line no-param-reassign
  return helper.hasChildren(item, keyname) && item[keyname].reduce((count, menu) => menu.visible === 1 ? ++count : count, 0) > 0
}
/**
   * @description 从接口返回的数据中计算出菜单
   * @param {Array} menuSource 接口返回的原始菜单数据
   */
route.getMenus = function(menuSource) {
  /**
     * @description 检验是否为合法菜单
     * @param {Object} sourceItem 原始数据的一项
     */
  function isEffectiveMenu(sourceItem) {
    if (sourceItem.menuName === '' || sourceItem.visible === 0) return
    return true
  }
  /**
     * @description 依次处理原始数据，返回处理后的菜单
     * @param {Array} menus 上次处理返回的结果
     * @param {Object} sourceItem 原始数据的一项
     */
  function maker(menus, sourceItem) {
    if (!isEffectiveMenu(sourceItem)) return menus
    const menu = {}
    menu.title = sourceItem.menuName
    menu.icon = sourceItem.icon
    menu.path = sourceItem.url

    if (hasMenuChildren(sourceItem)) menu.children = sourceItem.children.reduce(maker, [])
    menus.push(menu)
    return menus
  }
  return menuSource.reduce(maker, [])
}
/**
   * @description 从接口返回的数据中计算出路由
   * @param {Array} routeSource 接口返回的原始菜单数据
   */
route.getRoutes = function(routeSource) {
  const routes = []
  const menuArray = helper.flatTreeToArray({
    data: routeSource
  })
  menuArray.map(item => {
    if (isEffectiveRoute(item) && isUnregistered(routes, item)) {
      const route = {
        path: item.routePath,
        name: item.routeKey,
        meta: {
          title: item.menuName,
          auth: true,
          cache: item.routeCache === 1
        },
        component: _import(item.routeComponent)
      }
      routes.push(route)
    }
  })
  /**
   * 在主框架内显示
   */
  const frameIn = [
    {
      path: '/',
      redirect: { name: 'index' },
      component: layoutHeaderAside,
      children: [
        // 首页
        { path: 'index', name: 'index', meta: { title: '首页', auth: true }, component: _import('system/home') },
        // 系统 前端日志
        { path: 'log', name: 'log', meta: { title: '前端日志', auth: true }, component: _import('system/log')
        },
        // 刷新页面 必须保留
        { path: 'refresh', name: 'refresh', hidden: true, component: {
          beforeRouteEnter(to, from, next) {
            next(vm => vm.$router.replace(from.fullPath))
          },
          render: h => h()
        }
        },
        // 页面重定向 必须保留
        { path: 'redirect/:route*', name: 'redirect', hidden: true, component: {
          beforeRouteEnter(to, from, next) {
            next(vm => vm.$router.replace(JSON.parse(from.params.route)))
          },
          render: h => h()
        }
        },
        ...routes
      ]
    },
    demo
  ]
  return frameIn
}
export default route
